﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using negocio.readOnly;
using negocio.entidades;
using dao.daos;
using System.Data.SqlClient;

namespace negocio.servicios
{
    public class VentaService
    {

        public List<ProductoVentaReadOnly> FindAllReadOnlies()
        {
            List<ProductoVentaReadOnly> lista = new List<ProductoVentaReadOnly>();
            ProductoDao datos = new ProductoDao();
            SqlDataReader dr = datos.ObtenerTodosColumnas(false);
            while (dr.Read())
            {
                ProductoVentaReadOnly prod = new ProductoVentaReadOnly();

                prod.Id = int.Parse(dr["ID_PRODUCTO"].ToString());
                prod.Codigo = dr["CODIGO"].ToString();
                if (dr["NOMBRE"] != DBNull.Value)
                {
                    prod.TipoTela = dr["NOMBRE"].ToString();
                }
                else
                {
                    prod.TipoTela = " ";
                }
                prod.Stock = int.Parse(dr["STOCK"].ToString());
                prod.Descripcion = dr["DESCRIPCION"].ToString();
                prod.PrecioVenta = double.Parse(dr["PRECIO_VENTA"].ToString());

                lista.Add(prod);

            }
            return lista;
        }


        public List<ProductoVentaReadOnly> BuscarProducto(string filtro)
        {
            List<ProductoVentaReadOnly> lista = new List<ProductoVentaReadOnly>();
            ProductoDao datos = new ProductoDao();
            SqlDataReader dr = datos.ObtenerPorNombre(filtro, false);
            while (dr.Read())
            {
                ProductoVentaReadOnly prod = new ProductoVentaReadOnly();

                prod.Id = int.Parse(dr["ID_PRODUCTO"].ToString());
                prod.Codigo = dr["CODIGO"].ToString();
                if (dr["NOMBRE"] != DBNull.Value)
                    prod.TipoTela = dr["NOMBRE"].ToString();
                else
                    prod.TipoTela = " ";

                prod.Stock = int.Parse(dr["STOCK"].ToString());
                prod.Descripcion = dr["DESCRIPCION"].ToString();
                prod.PrecioVenta = double.Parse(dr["PRECIO_VENTA"].ToString());

                lista.Add(prod);
            }
            return lista;
        }

        public List<VentasReadOnly> BuscarVentas(int idEmpleado)
        {
            List<VentasReadOnly> lista = new List<VentasReadOnly>();
            VentaDao datos = new VentaDao();
            SqlDataReader dr = datos.ObtenerVentasXEmpleado(idEmpleado);
            while (dr.Read())
            {
                VentasReadOnly ven = new VentasReadOnly();

                ven.Id = (dr["ID_VENTA"]).ToString();
                ven.Fecha = Convert.ToDateTime(dr["FECHA_ALTA"]).ToShortDateString();
                ven.Monto = (dr["MONTO_TOTAL"].ToString());
                ven.NombreEmpleado = dr["NOMBRE"].ToString();

                lista.Add(ven);
            }
            return lista;
        }

        public List<Tarjeta> cargarComboTarjeta()
        {
            TarjetaDao datos = new TarjetaDao();
            SqlDataReader dr = datos.ObtenerTodo();
            List<Tarjeta> lista = new List<Tarjeta>();

            while (dr.Read())
            {
                Tarjeta t = new Tarjeta();
                t.Id = int.Parse(dr["ID_TARJETA"].ToString());
                t.Nombre = dr["NOMBRE"].ToString();

                lista.Add(t);
            }

            return lista;
        }

        public void registrarVenta(DateTime fecha, int idEmpleado, double montoTotal, List<DetalleVenta> prod, List<DetallePago> pagosRealizados)
        {
            VentaDao venta = new VentaDao();
            int idVenta = venta.numeroUltimaVenta() + 1;
            int idPago = venta.numeroUltimoPago() + 1;

            string stringVenta = GenerarStringVenta(fecha, idEmpleado, montoTotal);
            string[] stringDetVenta = GenerarStringDetalleVenta(idVenta, prod);
            string stringPago = GenerarStringPago(idVenta, montoTotal,fecha);
            string[] stringDetPago = GenerarStringDetallePago(idPago,pagosRealizados);
            venta.registrarVenta(stringVenta, stringDetVenta, stringPago, stringDetPago);
        }

        private string GenerarStringVenta(DateTime fecha, int e, double montoTotal)
        {
            string valores =
                string.Format(
                    "FECHA_ALTA ={0}, MONTO_TOTAL ={1}, ID_EMPLEADO ={2}",
                    fecha,
                    montoTotal,
                    e);

            return valores;
        }

        private string[] GenerarStringDetalleVenta(int idv, List<DetalleVenta> prod)
        {
            string[] valores = new string[prod.Count];
            int c = 0;
            foreach (var item in prod)
            {
                valores[c] =
                    string.Format("ID_VENTA ={0}, ID_PRODUCTO ={1}, CANTIDAD ={2}, PRECIO_VENTA={3}",
                    idv,
                    item.IdProducto,
                    item.Cantidad,
                    item.PrecioVenta);
                c++;
            }

            return valores;
        }

        private string GenerarStringPago(int idVenta, double precio, DateTime fecha)
        {
            string valores =
                string.Format(
                        "ID_VENTA ={0}, MONTO_TOTAL ={1}, FECHA_ALTA ={2}",
                        idVenta,
                        precio,
                        fecha);

            return valores;
        }

        private string[] GenerarStringDetallePago(int idPago, List<DetallePago> pagosRealizados)
        {
            string[] valores = new string[pagosRealizados.Count];
            int c = 0;
            foreach (var item in pagosRealizados)
            {
                valores[c] =
                    string.Format("ID_PAGO ={0}, TIPO_PAGO ={1}, ",
                    idPago,
                    item.TipoPago);
                    if (item.IdTarjeta!=null)
                        valores[c] += string.Format("ID_TARJETA ={0},", item.IdTarjeta);

                    valores[c] += string.Format("MONTO={0}, CANTDAD_CUOTAS={1}",
                    item.Monto,
                    item.CantidadCuotas);
                c++;
            }

            return valores;
        }

    }
}
